package com.winter.main.utils;

import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/***
 * 日期工具类
 */
public class DateUtil {

	// 静态常量
	private static SimpleDateFormat SDF_YMDHMS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private static SimpleDateFormat SDF_HMS = new SimpleDateFormat("HH:mm:ss");
	private static SimpleDateFormat SDF_Y_M_D = new SimpleDateFormat("yyyy-MM-dd");
	private static SimpleDateFormat SDF_YMDHMS_FNAME = new SimpleDateFormat("yyyyMMddHHmmss");
	private static SimpleDateFormat SDF_YMD = new SimpleDateFormat("yyyyMMdd");
	private static SimpleDateFormat SDF_MD = new SimpleDateFormat("MMdd");
	private static SimpleDateFormat SDF_CHINA_MD = new SimpleDateFormat("MM月dd日 yyyy年");

	/***
	 * 将时间字符串转为(YYYY-MM-dd)格式时间
	 * @param dateStr
	 * @return
	 */
	public static Date parseStrToDate(String dateStr) {
		Date date = null;
		try {
			date = SDF_Y_M_D.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 返回自定义规则时间格式(当前时间)
	 * @param pattern
	 * @return
	 */
	public static String getNowDate(String pattern){
		return new SimpleDateFormat(pattern).format(new Date());
	}

	/***
	 * 将当前时间转为(yyyyMMddHHmmss格式
	 * @return
	 */
	public static String getYmdhmsFName() {
		return SDF_YMDHMS_FNAME.format(new Date());
	}

	/***
	 * 将当前时间转为(YYYY-MM-dd)格式
	 * @return
	 */
	public static String getYmd() {
		return SDF_YMD.format(new Date());
	}

	/***
	 * 将当前时间转为(MMdd)格式
	 * @return
	 */
	public static String getMd() {
		return SDF_MD.format(new Date());
	}

	/***
	 * 将当前时间转为(HH:mm:ss)格式
	 * @return
	 */
	public static String getTime(){
		return SDF_HMS.format(new Date());
	}

	/***
	 * 转为中式日期格式
	 * @param dateStr
	 * @return
	 */
	public static String getChinaMd(String dateStr) {
		Date date = null;
		try {
			if (StringUtils.isEmpty(dateStr)) {
				date = new Date();
			}else {
				date = SDF_Y_M_D.parse(dateStr);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return SDF_CHINA_MD.format(date);
	}

	/***
	 * 获得完整的日期字符串(YYYY-MM-DD hh:mm:ss)
	 * @param minute 分
	 * @return
	 */
	public static String parseDateByMinute(int minute) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MINUTE, minute);
		return SDF_YMDHMS.format(calendar.getTime());

	}

	/***
	 * 获取日期字符串(YYYY-MM-DD)
	 * @param day 天
	 * @return
	 */
	public static String parseDateByDay(int day) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DATE, day);
		return SDF_Y_M_D.format(calendar.getTime());

	}

	/***
	 * 获得日期字符串(YYYY-MM-DD)
	 * @param date 时间
	 * @return
	 */
	public static String parseYmdDate(Date date) {
		return SDF_Y_M_D.format(date);
	}

	/***
	 * 获得完整的日期字符串(YYYY-MM-DD hh:mm:ss)
	 * @param date
	 * @return
	 */
	public static String parseYmdhmsDate(Date date) {
		return SDF_YMDHMS.format(date);
	}

	/**
	 * @Description 比较2个日期
	 * @return 0: 相等 -1: DATE2>DATE1 1:DATE2<DATE1
	 */
	public static int compareDate(Date DATE1, Date DATE2) {
		try {
			if (DATE1.getTime() > DATE2.getTime()) {
				return 1;
			} else if (DATE1.getTime() < DATE2.getTime()) {
				return -1;
			} else {
				return 0;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return 0;
	}

	/**
	 * @author chenyi
	 * @Description
	 * @param
	 * @date 2017-3-13
	 */
	public static int compareDate(Date DATE) {
		return compareDate((new Date()), DATE);
	}

	/**
	 * 比较两个时间大小（精确到时分秒）
	 * 
	 * @param timeone
	 *            格式（2017-02-07）
	 * @param timetow
	 *            格式（2017-02-07）
	 * @param type
	 *            (1比较大小有等于 2比较大小没等于)
	 * @return 1(timeone>timetow) -1(timeone<timetow) 2(timeone=timetow) 0错误
	 *         3(timeone>=timetow) -3(timeone<=timetow)
	 */
	public static int compare_dateTime(String timeone, String timetow, int type) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		try {
			Date dateone = sdf.parse(timeone);
			Date datetow = sdf.parse(timetow);
			if (type == 1) {
				if (dateone.getTime() >= datetow.getTime()) {
					return 3;
				} else if (dateone.getTime() <= datetow.getTime()) {
					return -3;
				} else if (dateone.getTime() == datetow.getTime()) {
					return 2;
				}
			} else if (type == 2) {
				if (dateone.getTime() > datetow.getTime()) {
					return 1;
				} else if (dateone.getTime() < datetow.getTime()) {
					return -1;
				} else if (dateone.getTime() == datetow.getTime()) {
					return 2;
				}
			} else {
				return 0;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return 0;
	}

	/**
	 * 比较两个时间大小（精确到天）
	 * 
	 * @param timeone
	 *            格式（2017-02-07）
	 * @param timetow
	 *            格式（2017-02-07）
	 * @param type
	 *            (1比较大小有等于 2比较大小没等于)
	 * @return 1(timeone>timetow) -1(timeone<timetow) 2(timeone=timetow) 0错误
	 *         3(timeone>=timetow) -3(timeone<=timetow)
	 */
	public static int compare_date(String timeone, String timetow, int type) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date dateone = sdf.parse(timeone);
			Date datetow = sdf.parse(timetow);
			if (type == 1) {
				if (dateone.getTime() >= datetow.getTime()) {
					return 3;
				} else if (dateone.getTime() <= datetow.getTime()) {
					return -3;
				} else if (dateone.getTime() == datetow.getTime()) {
					return 2;
				}
			} else if (type == 2) {
				if (dateone.getTime() > datetow.getTime()) {
					return 1;
				} else if (dateone.getTime() < datetow.getTime()) {
					return -1;
				} else if (dateone.getTime() == datetow.getTime()) {
					return 2;
				}
			} else {
				return 0;
			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return 0;
	}

	/***
	 * @Description 时间字符串，转时间戳
	 * @param
	 * @date 2017年8月5日 下午3:49:53
	 */
	public static String parseTime(String dateStr) {
		String re_time = null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d;
		try {
			d = sdf.parse(dateStr);
			long l = d.getTime();
			String str = String.valueOf(l);
			re_time = str.substring(0, 10);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return re_time;
	}

}
